package com.fhr.task;

import java.io.*;
import java.util.Scanner;

/**
 * @Author: win11
 * @Date: 2023/03/11/18:51
 * @Description:
 */
public class CopyDirectory2 {
    public static void main(String[] args) throws IOException {
        long start = System.currentTimeMillis();
        //正则表达式规定路径书写
        String regex="[a-zA-Z]:\\\\((\\w||\\W)+\\\\{0,}.$)";
        Scanner sc=new Scanner(System.in);
        while(true) {
            System.out.println("请输入要复制的文件路径:(格式应为:盘符:\\xxx\\xxx)");
            String s1 = sc.nextLine();
            File src = new File(s1);
            //判断复制文件是否存在
            if(!src.exists()){
                System.out.println("要复制的文件路径不存在,请重新输入:");
            } else if (s1.matches(regex)) {
                //判断复制路径是否匹配正则表达式
                System.out.println("请输入复制后的目标路径:(格式应为:盘符:\\xxx\\xxx)");
                String s2 = sc.nextLine();
                File dest = new File(s2);
                //判断目标路径是否匹配正则表达式
                if (s2.matches(regex)) {
                    copy(src, dest);
                    break;
                } else {
                    System.out.println("复制后的目标路径无效,格式应为:盘符:\\xxx\\xxx,请重新输入:");
                }
            } else {
                System.out.println("复制的文件路径无效,格式应为:盘符:\\xxx\\xxx,请重新输入:");
            }
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }

    /**
     * 参数一:数据源
     * 参数二:目标源(接受源)
     */

    private static void copy(File src,File dest) throws IOException {

        dest.mkdirs();
        //进入数据源
        //调用listFiles方法获取数据源中的文件/文件夹
        File[] files = src.listFiles();
        if(files==null){
            return;
        }
        //遍历files数组并判断
        for (File file : files) {
            //如果是文件,直接拷贝
            if (!file.isDirectory()) {
                //创建缓冲输入流读数据
                BufferedInputStream bir = new BufferedInputStream(new FileInputStream(file));
                //创建缓冲输出流写数据
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest, file.getName())));
                //一次读取一个字节数组
                byte[] b=new byte[1024];
                //一次读取的长度
                int len=0;
                while ((len = bir.read(b)) != -1) {
                    bos.write(b);
                }
                //释放数据
                bir.close();
                bos.close();
            } else {
                //如果是文件夹,递归
                copy(file, new File(dest, file.getName()));
            }
        }
    }
}
